#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Timer.h"
#include "OLED.h"
#include "HCSR04.h"
#include  "dht11.h"
#include "Serial.h"
#include "string.h"

#define USERNAME "demo&k21o1QTr3Da" //用户名
#define PASSWORD "0dcea4d478e3b35b6ccc63fad6258989cdbdb65c3a1db39762030ef8ff8cc02c" //密码
#define CLIENTID "k21o1QTr3Da.demo|securemode=2\\,signmethod=hmacsha256\\,timestamp=1735227063141|" //设备名称
#define PRODUCTID "k21o1QTr3Da" //产品ID
#define DOMAINNAME "iot-06z00isavuoirhw.mqtt.iothub.aliyuncs.com" //域名
#define DEVICENAME "demo" //设备名

uint64_t numlen(uint64_t num)//计算数字的长度
{
    uint64_t len = 1;        // 初始长度为1
    for(; num > 9; ++len)    // 判断num是否大于9，否则长度+1
        num /= 10;	         // 使用除法进行运算，直到num小于1
    return len;              // 返回长度的值
}

extern unsigned int rec_data[4]; //接受温度数据

int main(void)
{	
	OLED_Init();		//初始化OLED屏
	Timer_Init();		//初始化定时器
	HC_SR04_Init();		//初始化超声波测距模块
	Serial_Init();     //初始化串口uart1
	
	//连接物联网平台
	printf("AT+RST\r\n");//复位
	Delay_s(1);
	printf("ATE0\r\n");//关闭回显
	Delay_s(1);
	printf("AT+CWMODE=3\r\n");//设置双模式
	Delay_s(1);
	printf("AT+CWJAP=\"iphone13\",\"12345678\"\r\n");//设置wifi密码
	Delay_s(5);
	printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\",\"%s\",0,0,\"\"\r\n",USERNAME,PASSWORD);//设置MQTT的username和password
	Delay_s(2);
	printf("AT+MQTTCLIENTID=0,\"%s\"\r\n",CLIENTID);
	Delay_s(3);
	printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n",DOMAINNAME);
	Delay_s(4);
	//printf("AT+MQTTSUB=0,\"/%s/%s/user/get\",1\r\n",PRODUCTID,DEVICENAME);//订阅
	//Delay_s(2);
	
	while (1)
	{
			
		int Distance_mm=sonar_mm();			//获取距离测量结果，单位毫米（mm）
		int Distance_cm =Distance_mm/10;            //单位转换为厘米（cm）,这里是整数部分
		float Distance_cm_float = (float)Distance_mm / 10.0;  // 转换为浮点数用于保留一位小数
		float percentage = (float)Distance_cm_float / 6.0 * 100.0;  //容量百分比    
		//确保百分比最大为100
		if (percentage > 100) {
			percentage = 100;
		}
		int Distance_cm_p=Distance_mm%10;           //单位转换为厘米（cm）,这里是小数数部分 
		OLED_ShowString(0, 0,"distance(cm):",OLED_6X8);
		OLED_ShowNum(90,0,Distance_cm,numlen(Distance_cm),OLED_6X8);//显示整数部分
		OLED_ShowChar(90+numlen(Distance_cm)*6,0,'.',OLED_6X8);//显示小数点
		OLED_ShowNum(90+numlen(Distance_cm)*6+6,0,Distance_cm_p,numlen(Distance_cm_p),OLED_6X8);//显示小数部分
		
		DHT11_REC_Data(); //获取温度和湿度的数据
		float temperature_float = (float)rec_data[2] + (float)rec_data[3] / 10.0;  // 组合温度整数和小数部分为浮点数
        float humidity_float = (float)rec_data[0] + (float)rec_data[1] / 10.0;    // 组合湿度整数和小数部分为浮点数
		OLED_ShowString(0,16,"temperature:",OLED_6X8);
		OLED_ShowNum(90,16,rec_data[2],numlen(rec_data[2]),OLED_6X8);//显示整数部分
		OLED_ShowChar(90+numlen(rec_data[2])*6,16,'.',OLED_6X8);//显示小数点
		OLED_ShowNum(90+numlen(rec_data[2])*6+6,16,rec_data[3],1,OLED_6X8);//显示小数部分
		OLED_ShowString(0,32,"humidity:",OLED_6X8);
		OLED_ShowNum(90,32,rec_data[0],numlen(rec_data[0]),OLED_6X8);//显示整数部分
		OLED_ShowChar(90+numlen(rec_data[0])*6,32,'.',OLED_6X8);//显示小数点
		OLED_ShowNum(90+numlen(rec_data[0])*6+6,32,rec_data[1],1,OLED_6X8);//显示小数部分
			
		//发布消息
		printf("AT+MQTTPUBRAW=0,\"/sys/%s/%s/thing/event/property/post\",64,1,0\r\n",PRODUCTID,DEVICENAME);//复位
		Delay_s(1);
		printf("{\"params\":{\"temperature\":%.1f,\"humidity\":%.1f,\"distance\":%.1f}}\r\n", temperature_float, humidity_float, percentage);
		Delay_s(1);
		
		/*
		//接收订阅阿里云的消息
		char* index = strrchr(USART_ReceiveString,',');
		if(index != NULL)
		{
			OLED_ShowString(0,48,index+1,OLED_6X8);
		}
		*/
		
		Delay_ms(300);
		OLED_Update();
		Delay_ms(300);
		OLED_Clear();
		
		
	}
	
}
